/**
 * $Id: DateUtils.java,v 1.2 2013/11/04 03:39:25 chenlei Exp $
 */
package com.ms.common.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 时间相关的工具类
 * @author cl
 */
public class DateUtils {

	// 标识是否初始化
	private static boolean isInit = false;
	private static DateFormat DateFormat = null;
	private static DateFormat DateTimeFormat = null;
	private static DateFormat DateTimeStrFormat = null;
	private static DateFormat DateTimeCodeFormat = null;
	private static DateFormat DateFormatSimple = null;
	
	
	// 日期格式
	public static final String DATE_FORMAT = "yyyy-MM-dd";
	
	// 日期格式
	public static final String DATE_FORMAT_SIMPLE = "yyyy.MM.dd";
	// 日期格式
	public static final String DATE_FORMAT_CODE = "yyyyMMdd";
	// 日期时间格式
	public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
	// 日期时间格式2
	public static final String DATETIME_FORMAT_CN = "yyyy年MM月dd日 HH:mm:ss";
	// 日期时间格式2
	public static final String DATE_FORMAT_CN = "yyyy年MM月dd日";
	// 日期时间字符串格式
	public static final String DATETIME_STR_FORMAT = "yyyyMMdd_HHmmss";
	
	// 
	public static final int MinutePerDay = 24 * 60;
	
	/**
	 * 初始化时间格式化对象
	 */
	public static void init() {
		if(!isInit) {
			DateFormat = new SimpleDateFormat(DATE_FORMAT);
			DateTimeFormat = new SimpleDateFormat(DATETIME_FORMAT);
			DateTimeStrFormat = new SimpleDateFormat(DATETIME_STR_FORMAT);
			DateTimeCodeFormat= new SimpleDateFormat(DATE_FORMAT_CODE);
			DateFormatSimple=new SimpleDateFormat(DATE_FORMAT_SIMPLE);
			isInit = true;
		}
	}
	
	/**
	 * 取得当前日期时间字符串，格式由<code>DATETIME_FORMAT</code>指定
	 * @return 日期时间字符串
	 */
	public static String getCurrentDateTime() {
		init();
		return DateTimeFormat.format(new Date());
	}
	
	
	public static String getSimpleDateTime() {
		init();
		return DateFormatSimple.format(new Date());
	}
	
	
	
	/**
	 * 取得当前日期时间字符串，格式由<code>DATETIME_STR_FORMAT</code>指定
	 * @return 日期时间字符串
	 */
	public static String getCurrentDateTimeStr() {
		init();
		return DateTimeStrFormat.format(new Date());
	}
	
	/**
	 * 取得当前日期时间字符串，格式由<code>DATETIME_STR_FORMAT</code>指定
	 * @return 日期时间字符串
	 */
	public static String getCurrentDateTimeCode() {
		init();
		return DateTimeCodeFormat.format(new Date());
	}
	
	/**
	 * 取得当前日期字符串，格式由<code>DATE_FORMAT</code>指定
	 * @return 日期字符串
	 */
	public static String getCurrentDate() {
		init();
		return DateFormat.format(new Date());
	}
	
	/**
	 * 格式化日期时间对象
	 * @param date 日期时间对象
	 * @return 字符串形式的日期时间
	 */
	public static String formatDateTime(Date date) {
		init();
		if(date == null) {
			return "";
		}
		return DateTimeFormat.format(date);
	}
	
	/**
	 * 格式化日期对象
	 * @param date 日期对象
	 * @return 字符串形式的日期
	 */
	public static String formatDate(Date date) {
		init();
		if(date == null) {
			return "";
		}
		return DateFormat.format(date);
	}

	/**
	 * 格式化指定日期对象的下一天
	 * @param date 日期对象
	 * @return 字符串形式的日期
	 */
	public static String formatNextDate(Date date) {
		init();
		if(date == null) {
			return "";
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_YEAR, 1);
		date = calendar.getTime();
		return DateFormat.format(date);
	}
	
	public static String formatTimeLength(int time) {
		String timeStr = "";
		if(time < 60) {
			timeStr = time + "分钟";
		} else if(time < MinutePerDay) {
			timeStr = time/60 + "小时";
		} else {
			timeStr = time/MinutePerDay + "天";
		}
		return timeStr;
	}
	
	/**
	 * 根据字符串取得指定的日期时间对象
	 * @param date 字符串
	 * @return 日期时间对象
	 * @throws ParseException
	 */
	public static Date getDateTime(String date) throws ParseException {
		init();
		if(date == null || "".equals(date)) {
			return null;
		}
		return DateTimeFormat.parse(date);
	}
	
	/**
	 * 根据字符串取得指定的日期对象
	 * @param date 字符串
	 * @return 日期对象
	 * @throws ParseException
	 */
	public static Date getDate(String date) throws ParseException {
		init();
		if(date == null || "".equals(date)) {
			return null;
		}
		return DateFormat.parse(date);
	}
	
	/**
	 * 比较时间是否在当前时间之前
	 * @param date 指定的时间
	 * @return true为在当前时间之前
	 */
	public static boolean beforeNow(Date date) {
		return new Date().after(date);
	}
	
	/**
	 * 取得当前日期时间字符串，格式由<code>DATE_FORMAT2</code>指定
	 * @return 日期时间字符串
	 * add by zcf
	 */
	public static String parseDateForChinese(Date date){
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_CN);
		return sdf.format(date);
	}
	
	/**
	 * 取得当前日期时间字符串，格式由<code>DATETIME_FORMAT2</code>指定
	 * @return 日期时间字符串
	 * add by zcf
	 */
	public static String parseDateTimeForChinese(Date date){
		SimpleDateFormat sdf = new SimpleDateFormat(DATETIME_FORMAT);
		return sdf.format(date);
	}
	
	
	public static void main(String[] args) throws ParseException {
		String dateStr = formatNextDate(getDate("2010-12-31"));
		System.out.println(dateStr);
	}
	/**
	 * 获取当前年份
	 */
	public static int getYear(){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		return calendar.get(Calendar.YEAR);
	}
}
